package java行为型设计模式.责任链模式;


import static com.sun.activation.registries.LogSupport.log;

/**
 * 责任链模式为请求创建一个接收者对象列表。
 *
 * 这种模式是行为模式。
 *
 * 当使用责任链模式时，通常每个接收器包含对另一个接收器的引用。
 *
 * 如果一个对象不能处理请求，则它将相同的对象传递给下一个接收者，等等。
 */
public class Main {
    private static Logger getChainOfLoggers(){
        EMailLogger eMailLogger = new EMailLogger();
        FileLogger fileLogger = new FileLogger();
        ConsoleLogger consoleLogger = new ConsoleLogger();

        eMailLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);
        return eMailLogger;
    }

    public static void main(String[] args) {
        Logger loggerChain = getChainOfLoggers();
        loggerChain.logMessage("Null pointer");
        loggerChain.logMessage("Array Index Out of Bound");
        loggerChain.logMessage("Illegal Parameters");
    }
}
abstract class Logger{
    protected Logger nextLogger;

    public void setNextLogger(Logger nextLogger){
        this.nextLogger = nextLogger;
    }
    public void logMessage(String message){
        log(message);
        if (nextLogger != null){
            nextLogger.logMessage(message);
        }
    }
    abstract protected void log(String message);
}
class ConsoleLogger extends Logger{
    public ConsoleLogger(){

    }

    @Override
    protected void log(String message) {
        System.out.println("Console::Logger" + message + nextLogger);
//        System.out.println(nextLogger);

    }
}
class EMailLogger extends Logger {
    public EMailLogger(){
    }
    @Override
    protected void log(String message) {
        System.out.println("EMail::Logger: " + message + nextLogger);

//        System.out.println(nextLogger);
    }
}
class FileLogger extends Logger {
    public FileLogger(){
    }
    @Override
    protected void log(String message) {
        System.out.println("File::Logger: " + message + nextLogger);
//        System.out.println(nextLogger);

    }
}